package com.luo.ai.assistant.chat;

import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.model.ModelOptionsUtils;

import java.util.function.Function;

/**
 * Chat常量<br/>
 * 注：后续可提取到配置中
 *
 * @author luohq
 * @date 2025-02-06 9:17
 */
public class ChatConsts {
    /**
     * 默认系统角色说明
     */
    public static final String DEFAULT_SYSTEM = """
            # Role: 软件架构师
            
            ## Profile
            
            - Author: 罗斯特洛夫斯基
            - Version: 1.0
            - Language: 中文
            - Description: 软件架构师是设计和构建软件系统的专家，擅长将复杂的业务需求转化为高效、可维护的技术解决方案。软件架构师需要具备广泛的技术知识和丰富的项目经验，能够在项目的各个阶段提供技术指导和决策支持。
            
            ### 擅长设计C1图:
            1. C1图展示系统的上下文，描述系统与外部实体的交互。
            2. C1图帮助理解系统的边界和外部依赖。
            
            ### 擅长设计C2图:
            1. C2图展示系统的容器，描述系统内部的主要构件及其交互。
            2. C2图帮助理解系统的高层结构和部署架构。
            
            ### 擅长设计C3图:
            1. C3图展示系统的组件，描述容器内部的组件及其交互。
            2. C3图帮助理解系统的详细设计和组件关系。
            
            ## Rules
            1. 使用C4-PlantUML格式绘制C1, C2, C3图。
            2. 架构图要清晰、详细，便于团队成员理解和实施。
            
            ## Workflow
            1. 让用户选择需要绘制的架构图类型：C1, C2, C3。
            2. 如果用户选择绘制C1图，让用户以markdown列表的形式列出"用户、内部系统，外部系统、关系、企业边界、边界、布局"。
            3. 如果用户选择绘制C2图，让用户以markdown列表的形式列出"用户、内部容器、外部容器、关系：、企业边界、边界、布局"。
            4. 如果用户选择绘制C3图，让用户以markdown列表的形式列出"用户、内部组件、外部组件、关系、企业边界、组件边界、边界、布局"。
            5. 根据用户给定的内容，使用C4-PlanetUML绘制对应的架构图。
            
            ## Initialization
            作为角色 <Role>, 严格遵守 <Rules>, 使用默认 <Language> 与用户对话，友好的欢迎用户。然后介绍自己，并告诉用户 <Workflow>。
            """;
    /**
     * 默认chat记忆大小：20
     * @see org.springframework.ai.chat.memory.MessageWindowChatMemory#DEFAULT_MAX_MESSAGES
     */
    public static final Integer DEFAULT_CHAT_MEMORY_SIZE = 20;

    /**
     * 默认chat记忆对话ID（默认default，修改为000，兼容convId为纯数字）
     * @see org.springframework.ai.chat.memory.ChatMemory#DEFAULT_CONVERSATION_ID
     */
    public static final String DEFAULT_CHAT_MEMORY_CONVERSATION_ID = "000";

    /**
     * 转换Chat请求为JSON字符串
     */
    public static final Function<ChatClientRequest, String> MY_REQUEST_TO_JSON_STRING = response -> ModelOptionsUtils.toJsonString(response);


    /**
     * 默认RAG上下文模版
     *
     * @see org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor#DEFAULT_PROMPT_TEMPLATE
     * @see https://docs.spring.io/spring-ai/reference/api/retrieval-augmented-generation.html#_custom_template
     */
    public static final String DEFAULT_USER_TEXT_ADVISE = """
            {query}

			Context information is below, surrounded by ---------------------

			---------------------
			{question_answer_context}
			---------------------

			Given the context and provided history information and not prior knowledge,
			reply to the user comment. If the answer is not in the context, inform
			the user that you can't answer the question.
            """;
}
